创建 Charge 对象

发起一次支付请求时需要创建一个新的 charge 对象,获取一个可用的支付凭据用于客户端向第三方渠道发起支付请求。如果使用测试模式的 API Key,则不会发生真实交易。当支付成功后,Ping++ 会发送 Webhooks 通知。

请求参数描述
order_no required string商户订单号,适配每个渠道对此参数的要求,必须在商户的系统内唯一。(支付宝全渠道: 1-64 位的数字和字母组合; wx: 2-32 位; wx_pub_scan、cb_wx、cb_wx_pub、cb_wx_pub_qr、cb_wx_pub_scan、paypal、coolcredit: 1-32 位的数字和字母组合; bfb: 1-20 位;银联全渠道: 8-40 位的数字和字母组合; yeepay_wap: 1-50 位;jdpay_wap: 1-30 位;qpay:1-30 位;isv_qr、isv_scan、isv_wap: 8-32 位,不重复,建议时间戳+随机数(或交易顺序号);ccb_pay、ccb_qr:1-30 位数字和字母组合;cmpay: 1~50 位的数字和字母组合;cmb_wallet: 6-32 位的数字和字母组合,一天内不能重复,订单日期+订单号唯一定位一笔订单,示例: 20170808test01)。注:推荐使用 8-20 位的数字和字母组合,不允许特殊字符。
app[id] expandable required hash支付使用的 app 对象的 idexpandable 可展开,查看如何获取App ID
channel required string支付使用的第三方支付渠道。参考 支付渠道属性值
amount required int订单总金额(必须大于 0),单位为对应币种的最小货币单位,人民币为分。如订单总金额为 1 元,amount 为 100。
client_ip required ip address发起支付请求客户端的 IP 地址,支持 IPv4、IPv6 格式。微信H5支付必须上传用户真实 IP 地址,获取方式详见用户 IP 指引)
currency required string3 位 ISO 货币代码,小写字母,人民币为 cny。使用跨境渠道参考 跨境渠道 currency 说明 ;使用 isv_lite 渠道只支持 cny,hkd 其中的一个值。
subject required string商品标题,该参数最长为 32 个 Unicode 字符。银联全渠道限制在 32 个字节;支付宝部分渠道不支持特殊字符;cmpay 渠道限制为 1~25 个 Unicode 字符;isv_lite 渠道限制为:1~20 个 unicode 长度,不允许以下特殊字符串"\n\r,,~!@#¥%……&*()【】「」"
body required string商品描述信息,该参数最长为 128 个 Unicode 字符。yeepay_wap 对于该参数长度限制为 100 个 Unicode 字符;支付宝部分渠道不支持特殊字符。
extra conditional hash特定渠道发起交易时需要的额外参数,以及部分渠道支付成功返回的额外参数,详细参考支付渠道 extra 参数说明
time_expire optional timestamp订单失效时间的 Unix 时间戳。时间范围在订单创建后的 1 分钟到 15 天,默认为 1 天,创建时间以 Ping++ 服务器时间为准。微信对该参数的有效值为 2 小时内;upacp、upacp_pc、upacp_wap、cp_b2b、applepay_upacp 渠道对该参数的有效值限制为 1 小时内;upacp_b2b 对该参数的有效值限制为 1 天内;upacp_qr 渠道对该参数的有效期默认为 1 天,最大为 30 天;此参数对 paypalscan 类渠道无效。
metadata optional hash参考 元数据
description optional string订单附加说明,最多 255 个 Unicode 字符。

返回

返回一个支付凭据 charge 对象。鉴于支付渠道对 order_no 的合法性要求,为了保证支付请求的正确处理,请务必保证对于同一支付渠道下,不同支付产品间 order_no 的唯一性。例如:已在微信 JSAPI 支付下使用的 order_no 则无法在微信 Native 扫码下重复使用,该规则同样适用于其他同类渠道。如果发生错误,则会返回错误码和错误详情,详见 错误

定义

POST https://api.pingxx.com/v1/charges
\Pingpp\Charge::create();
Charge.create();
Pingpp::Charge.create();
pingpp.charges.create();
pingpp.Charge.create()
ch,err := charge.New(&ChargeParams)
create(Dictionary<String, Object> param)

请求示例

curl https://api.pingxx.com/v1/charges \
-u sk_test_ibbTe5jLGCi5rzfH4OqPW9KC: \
-d order_no=123456789 \
-d amount=100 \
-d app[id]=app_1Gqj58ynP0mHeX1q \
-d channel=upacp \
-d currency=cny \
-d client_ip=127.0.0.1 \
-d subject="Your Subject" \
-d body="Your Body"
\Pingpp\Pingpp::setApiKey('sk_test_ibbTe5jLGCi5rzfH4OqPW9KC');

\Pingpp\Charge::create(array(
    'order_no'  => '123456789',
    'amount'    => '100',
    'app'       => array('id' => 'app_1Gqj58ynP0mHeX1q'),
    'channel'   => 'upacp',
    'currency'  => 'cny',
    'client_ip' => '127.0.0.1',
    'subject'   => 'Your Subject',
    'body'      => 'Your Body'
  ));
Pingpp.apiKey = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC";

Map<String, Object> chargeParams = new HashMap<String, Object>();
chargeParams.put("order_no",  "123456789");
chargeParams.put("amount", 100);
Map<String, String> app = new HashMap<String, String>();
app.put("id", "app_1Gqj58ynP0mHeX1q");
chargeParams.put("app", app);
chargeParams.put("channel",  "upacp");
chargeParams.put("currency", "cny");
chargeParams.put("client_ip",  "127.0.0.1");
chargeParams.put("subject",  "Your Subject");
chargeParams.put("body",  "Your Body");

Charge.create(chargeParams);
require "pingpp"
Pingpp.api_key = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC"
Pingpp::Charge.create(
   :subject  => "Your Subject",
   :body     => "Your Body",
   :amount   => 100,
   :order_no => "123456789",
   :channel  => "upacp",
   :currency => "cny",
   :client_ip=> '127.0.0.1',
   :app => {'id' => "app_1Gqj58ynP0mHeX1q"}
 )
var pingpp = require('pingpp')('sk_test_ibbTe5jLGCi5rzfH4OqPW9KC');
pingpp.charges.create({
    subject: "Your Subject",
    body: "Your Body",
    amount: 100,
    order_no: "123456789",
    channel: "upacp",
    currency: "cny",
    client_ip: "127.0.0.1",
    app: {id: "app_1Gqj58ynP0mHeX1q"}
  }, function(err, charge) {
    // 异步调用
});
ch = pingpp.Charge.create(
    order_no='1234567890',
    amount=100,
    app=dict(id='app_1Gqj58ynP0mHeX1q'),
    channel='upacp',
    currency='cny',
    client_ip='127.0.0.1',
    subject='Your Subject',
    body='Your Body',
)
params := &ChargeParams{
   Order_no:  "123456789",
   App:       pingpp.App{Id: "app_1Gqj58ynP0mHeX1q"},
   Channel:   "upacp",
   Amount:    100,
   Currency:  "cny",
   Client_ip: "127.0.0.1",
   Subject:   "Your Subject",
   Body:      "Your Body",
}
  //获得的第一个参数即是 Charge 对象
ch, err := charge.New(params)
Dictionary<String, Object> app = new Dictionary<String, Object>();
app.Add("id", app_1Gqj58ynP0mHeX1q);
Dictionary<String,Object> extra = new Dictionary<String,Object>();
Dictionary<String, Object> params = new Dictionary<String, Object>();
params.Add("amount", 100);
params.Add("currency", "cny");
params.Add("subject", "Your Subject");
params.Add("body", "Your Body");
params.Add("order_no", "123456789");
params.Add("channel", "upacp");
params.Add("client_ip", "127.0.0.1");
params.Add("app", app);     
params.Add("extra", extra);
try {
       //发起交易请求
       Charge ch = Charge.create(params);
       Console.WriteLine(ch);
   } catch (Exception e) {
       Console.WriteLine(e.Message.ToString());
}

返回示例

{
  "id": "ch_L8qn10mLmr1GS8e5OODmHaL4",
  "object": "charge",
  "created": 1410834527,
  "livemode": true,
  "paid": false,
  "refunded": false,
  "reversed": false,
  "app": "app_1Gqj58ynP0mHeX1q",
  "channel": "upacp",
  "order_no": "123456789",
  "client_ip": "127.0.0.1",
  "amount": 100,
  "amount_settle": 100,
  "currency": "cny",
  "subject": "Your Subject",
  "body": "Your Body",
  "extra":{},
  "time_paid": null,
  "time_expire": 1410838127,
  "time_settle": null,
  "transaction_no": null,
  "refunds": {
    "object": "list",
    "url": "/v1/charges/ch_L8qn10mLmr1GS8e5OODmHaL4/refunds",
    "has_more": false,
    "data": [ ]
  },
  "amount_refunded": 0,
  "failure_code": null,
  "failure_msg": null,
  "metadata": {},
  "credential": {
    "object": "credential",
    "upacp": {
      "tn": "201409161028470000000",
      "mode": "01"
    }
  },
  "description": null
}